package logica;

import logica.persistencia.ObjetoDiagramaPersistente;
import memento.EstadoGuardable;
import memento.IMemento;

import java.util.LinkedList;
import java.util.List;
import java.util.Observable;

import vista.objetos.GraficableConEtiqueta;

public abstract class ObjetoDiagrama extends Observable implements EstadoGuardable {
	
	private String nombre;
	private List<GraficableConEtiqueta> graficables = new LinkedList<>();
	private Diagrama diagrama;
		
	public ObjetoDiagrama(String nombre) throws SinNombreException {
		this.setNombre(nombre);
		this.setDiagrama(null);
	}

	public void setNombre(String nombre) throws SinNombreException 
	{
		if (nombre.isEmpty())
			throw new SinNombreException("Falta un nombre para el objeto diagrama.");
		
		this.nombre = nombre;
		this.setChanged();
		this.notifyObservers();
	}

	public String getNombre() {
		return nombre;
	}
	
	public void agregarseAlDiagrama(Diagrama diagrama) throws IdExternoInexistenteException, EntidadRepetidaException {
		diagrama.agregarObjetoDiagramaAlDiagrama(this);
	}
	
	public void eliminaseDelDiagrama() {
		diagrama.eliminarObjetoDiagramaDelDiagrama(this);
	}
	
	public void verificarSiSePuedeAgregarAlDiagrama(Diagrama diagrama) throws IdExternoInexistenteException, EntidadRepetidaException  {
		diagrama.verificarSiDependenciasExternasExisten(this);
	}
	
	public abstract List<Entidad> getReferenciaAEntidadesExternas();

	public abstract ObjetoDiagramaPersistente getObjetoDiagramaPersistente();
	
	public abstract boolean tieneEstaEntidad(Entidad entidad);
	
	public List<GraficableConEtiqueta> getGraficables() {
		return this.graficables;
	}

	public Diagrama getDiagrama() {
		return diagrama;
	}

	public void setDiagrama(Diagrama diagrama) {
		this.diagrama = diagrama;
	}

	@Override
	public IMemento getMementoGenerico() {
		return this.getMementoEspecializado();
	}
}
